unit XMLStrategy ;

interface

uses
   Classes,
   XmlParser,
   XmlInterpreter,
   XmlVisitors,
   uObjects ;

type

   TXmlStrategy = class
   private
      FParser : TXmlParser ;
      FInterpreter : TXmlInterpreter ;
      FVisitor : TXmlBuilder ;
   protected
   public
      constructor Create( aVisitorClass : TXmlBuilderClass ) ; virtual ;
      destructor Destroy ; override ;

      function Build( aModule : TMedaModule ; aText : string ) : TMedaPart ;
      function BuildFromStream( aModule : TMedaModule ; aStream : TStream ) : TMedaPart ;
      function BuildFromFile( aModule : TMedaModule ; aFilename : string ) : TMedaPart ;
   end ;

implementation

uses
   SysUtils ;

{ TXmlStrategy }

constructor TXmlStrategy.Create( aVisitorClass : TXmlBuilderClass ) ;
begin
   inherited Create ;
   fParser := TXmlParser.Create ;
   fInterpreter := TXmlInterpreter.Create ;
   fVisitor := aVisitorClass.Create ;
end ;

destructor TXmlStrategy.Destroy ;
begin
   fParser.Free ;
   fInterpreter.Free ;
   fVisitor.Free ;
   inherited ;
end ;

function TXmlStrategy.Build( aModule : TMedaModule ; aText : string ) : TMedaPart ;
begin
   fParser.Parse( aText, FInterpreter.XmlDoc ) ;
   fVisitor.Module := aModule ;
   fInterpreter.XmlDoc.Accept( fVisitor ) ;
   Result := fVisitor.Building as TMedaPart ;
end ;

function TXmlStrategy.BuildFromFile( aModule : TMedaModule ; aFilename : string ) : TMedaPart ;
begin
   with TStringList.Create do try
      LoadFromFile( aFilename ) ;
      Build( aModule, Text ) ;
   finally
      Free ;
   end ;
end ;

function TXmlStrategy.BuildFromStream( aModule : TMedaModule ; aStream : TStream ) : TMedaPart ;
begin
   with TStringList.Create do try
      LoadFromStream( aStream ) ;
      Build( aModule, Text ) ;
   finally
      Free ;
   end ;
end ;

end.

